/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.beans;

import com.debug.Debug;
import com.util.Conectar;
import com.util.MD5;
import com.util.UtilConsultas;
import java.sql.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.NamingException;

/**
 *
 * @author victor
 */
public class UsuarioBean {
    private String nick;
    private String password; //guarda la password ya encriptada
    private String nombre;
    private String cuota;
    private boolean valido;
    private ArrayList categorias;
    private ArrayList nombresCategorias;
    private ArrayList areas;  // Guarda los ids de las areas (noticias)
    private ArrayList descripcion;  //Guarda las desdripciones de las areas.
    private ArrayList idLigas;
    private ArrayList descLigas;

    /**
     * Devuelve la cuota que tiene asignada el usuario, es un String en Mb
     * pero solo es el numero.
     * @return
     */
    public String getCuotaString() {
        return cuota;
    }
    /**
     * Devuelve un int con la cuota del usuario en Mb
     * @return
     */
    public int getCuotaIntMb() {
        return Integer.parseInt(cuota);
    }
    /**
     * Devuelve un entero con la cuota en Kb
     * @return
     */
    public int getCuotaIntKb(){
        return getCuotaIntMb()*1024;
    }
    /**
     * Devuelve un int con la cuota del usuario en Bytes
     * @return
     */
    public int getCuotaIntb(){
        return getCuotaIntMb()*1024*1024;
    }

    public void setCuota(String cuota) {
        this.cuota = cuota;
    }
    
    public ArrayList getCategorias() {
        return categorias;
    }

    public void setCategorias(ArrayList categorias) {
        this.categorias = categorias;
    }
   /**
    * Le pasas un id de una categoria y te dice si el usuario tiene o no permisos
    * en esa categoria
    * @param id categoria en la que queremos comprobar si el usuario tiene o no permisos
    * @return true si sí que tiene esa categoria y false si no la tiene.
    */
    public boolean categoriaValida(String id){
        if(categorias==null){
            return false;
        }
        for(int i=0;i<this.categorias.size();i++){
            if(((String)this.categorias.get(i)).equals(id)){
                return true;
            }
        }
        return false;
    }
    /**
     * Nos dice si un usuario pertenece a una categoria o no
     * @param id area por la que queremos preguntas. EL id del area
     * @return true si el usuario pertenece a la categoría y false
     * si no pertenece a la catedoría
     */
    public boolean areaValida(String id){
        if(areas==null){
            return false;
        }
        for(int i=0;i<this.areas.size();i++){
            if(((String)this.areas.get(i)).equals(id)){
                return true;
            }
        }
        return false;
    }
    /**
     * Comprueba si el suario tiene permisos para la liga pasada como argumento
     * @param id Id de la liga a comprobar
     * @return True si el usuario tiene permisos y false si no los tiene.
     */
    public boolean ligaValida(String id){
        if(idLigas==null){
            return false;
        }
        for(int i=0;i<this.idLigas.size();i++){
            if(((String)this.idLigas.get(i)).equals(id)){
                return true;
            }
        }
        return false;
    }
    public ArrayList getNombresCategorias() {
        return nombresCategorias;
    }

    public void setNombresCategorias(ArrayList nombresCategorias) {
        this.nombresCategorias = nombresCategorias;
    }
    //private ArrayList subAreas;
    private int perfil;
    //estos parametros no seran publicos por medio de ningun metodo
    private int cont = 0; //Sirve para comprobar si es la primera vez que intenta validarse o ya lleve mas, en ese caso dse hace un pausa
    //private boolean permitido;
    
    public UsuarioBean(String nick,String password){
        this.nick=nick;
        this.password=password;
        this.comprobarUsuarioValido();
    }
    public String getNick() {
        return nick;
    }

    public String getPassword() {
        return password;
    }

    public void setNick(String nick) {
        this.nick = nick;
    }

    public void setPassword(String password) {
        this.valido=false; //Al cambiar la contraseña marcamos al usuario como no valido, hasta que haga la comprobacion
        this.password = MD5.convertir(password);
    }

    public UsuarioBean() {
        this.valido = false;
    }
/**
 * Con los datos de la clase, comprueba que los datos del usuario (de la clase)
 * son validos (estan en al base de datos). Si se encuentran en la base de datos
 * el usuario es valido y se pone a true el atributo "valido".
 * Tambien se rellena el arrayList categorias con los ids de las categorias
 * en las que puede guardar. Y las areas en las que puede crear noticias.
 */
    private void comprobarUsuarioValido() {
        String selectCustomerStr;
        Connection connection = null;
        selectCustomerStr =
                "SELECT * FROM usuarios " +
                "WHERE usuarios.nick = ?";
        PreparedStatement selectStatement = null;
        System.out.println("0 "+selectCustomerStr);
        try {
            System.out.println("0.1");
            connection = Conectar.getConnection();
            System.out.println("0.2");
            selectStatement = connection.prepareStatement(selectCustomerStr);
            System.out.println("0.3");
            selectStatement.setString(1, nick);
            System.out.println("1: "+selectStatement);
            ResultSet rs = selectStatement.executeQuery();
            System.out.println("2");
            if (rs.next()) {
                System.out.println("3");
                if (rs.getString("password").equals(this.password)) {
                    this.valido = true;
                    this.nombre = rs.getString("nombre");
                    this.cuota = rs.getString("cuota");
                    this.cont=0;
                    System.out.println("3");
                    //System.out.println("si otro");
                    this.categorias=new ArrayList();
                    this.nombresCategorias=new ArrayList();
                    this.areas=new ArrayList();
                    this.descripcion=new ArrayList();
                    this.idLigas=new ArrayList();
                    this.descLigas=new ArrayList();
                    System.out.println("4");
                    UtilConsultas.getCategorias(nick,categorias,nombresCategorias);
                    UtilConsultas.getAreas(nick, areas, descripcion);
                    System.out.println("5");
                    UtilConsultas.getLigas(nick, idLigas, descLigas);
                    System.out.println("6");
                    //System.out.println("cate "+categorias.toString());
                    //System.out.println("areas "+descripcion.toString());
                    //System.out.println("ligas "+descLigas.toString());
                }
            } else {
                this.nombre = "";
                //this.perfil = 0;
                this.valido = false;
            }
            rs.close();
            
        } catch (Exception e) {
            System.out.println("Excepcion: "+e.getMessage());
        } finally {
            try {
                connection.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void setPerfil(int perfil) {
        this.perfil = perfil;
    }

    public void setValido(boolean valido) {
        //No utilizamos el valor que nos pasen como parametro, ser�a un fallo
        //para la seguridad.
        this.valido = isValido();
    }

    public String getNombre() {
        return nombre;
    }

    public int getPerfil() {
        return perfil;
    }
    /**
     * Se duerme cinco segundos si el usuario no es valido
     * y el usuario ya lleva mas de un intento, con esto conseguimos que si
     * el usuario hace un intento fallido no se retrase el segundo, pero
     * el resto ser�n mas lentos.
     */
    public boolean isValido() {
        if (!this.valido) {
            this.comprobarUsuarioValido();
            if (!this.valido) {
                try {
                    if (cont > 0) {
                        Thread.sleep(5000);
                    }
                    this.cont++;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
        return valido;
    }
    public String cambiarContrasena(String nueva){
        if(!this.isValido()){
            return "No tiene permiso";
        }
        String nuevaEnc=MD5.convertir(nueva);
        this.setPassword(nueva);
        Connection conexion=null;
        try {
            conexion = Conectar.getConnection();
            String updateSQL = "UPDATE usuarios SET " +
                    " password= ? "+
                    " WHERE usuarios.nick = ?";
            //System.out.println("Sentencia "+updateSQL);
            PreparedStatement updateStatement = null;
            updateStatement = (PreparedStatement) conexion.prepareStatement(updateSQL);
            //System.out.println("Id en la actualizacion: " + idOferta);
            updateStatement.setString(1, nuevaEnc);
            updateStatement.setString(2, nick);
            updateStatement.executeUpdate();
            Debug.getInstance().putLog(null, "El usuario "+nick+" ha cambiado la contrase�a");
            //System.out.println("se ha ejecutado el cambio de password");
            updateStatement.close();
            conexion.close();
            return "Se ha cambiado la contrase�a";
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally{
            try {
                if(conexion!=null)conexion.close();
            } catch (SQLException ex) {
                Logger.getLogger(UsuarioBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return "No se ha cambiado la contrase�a";
        
    }
}
